package controller

import (
	"net/http"

	"gitee.com/ysl729895/go-mall/internal/model"
	"gitee.com/ysl729895/go-mall/internal/service"
	"github.com/gin-gonic/gin"
)

// CategoryController 处理分类相关的HTTP请求
type CategoryController struct {
	service service.CategoryService // 依赖服务层接口
}

// NewCategoryController 构造函数：创建分类控制器实例
// 参数 service: 分类服务实例
// 返回值: 分类控制器指针
func NewCategoryController(service service.CategoryService) *CategoryController {
	return &CategoryController{service: service}
}

// CreateCategory 处理创建分类的HTTP POST请求
// @Summary 创建商品分类
// @Tags 分类管理
// @Accept json
// @Produce json
// @Param name body string true "分类名称"
// @Success 201 {object} model.Category
// @Router /api/categories [post]
func (c *CategoryController) CreateCategory(ctx *gin.Context) {
	// 定义请求体结构
	var input struct {
		Name string `json:"name" binding:"required"` // binding标签用于参数验证
	}

	// 绑定JSON请求体并验证
	if err := ctx.ShouldBindJSON(&input); err != nil {
		ctx.AbortWithStatusJSON(http.StatusBadRequest, model.ErrorResponse{
			Code:    http.StatusBadRequest,
			Message: "请求参数格式不正确",
			Error:   err.Error(),
		})
		return
	}

	// 调用服务层方法创建分类
	category, err := c.service.CreateCategory(input.Name)
	if err != nil {
		ctx.AbortWithStatusJSON(http.StatusInternalServerError, model.ErrorResponse{
			Code:    http.StatusInternalServerError,
			Message: "创建分类失败",
			Error:   err.Error(),
		})
		return
	}

	// 设置响应数据
	ctx.Set("responseData", category)
	ctx.Set("responseMessage", "创建分类成功")
	ctx.Status(http.StatusCreated)
}

// GetCategories 处理获取分类列表的HTTP GET请求
// @Summary 获取所有分类
// @Tags 分类管理
// @Produce json
// @Success 200 {array} model.Category
// @Router /api/categories [get]
func (c *CategoryController) GetCategories(ctx *gin.Context) {
	// 调用服务层方法获取数据
	categories, err := c.service.GetCategories()
	if err != nil {
		ctx.AbortWithStatusJSON(http.StatusInternalServerError, model.ErrorResponse{
			Code:    http.StatusInternalServerError,
			Message: "获取分类列表失败",
			Error:   err.Error(),
		})
		return
	}

	// 设置响应数据
	ctx.Set("responseData", categories)
	ctx.Set("responseMessage", "获取分类成功")
}
